package org.bigdata.framework.core.protocol;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.bigdata.framework.core.model.Classes;
import org.bigdata.framework.core.model.CommonDataProperty;
import org.bigdata.framework.core.model.CommonObjectProperty;
import org.bigdata.framework.core.model.DataProperty;
import org.bigdata.framework.core.model.Dict;
import org.bigdata.framework.core.model.DictItem;
import org.bigdata.framework.core.model.ObjectProperty;

/**
 * 全文检索接口
 * 
 * @author vimes
 * 
 */
public interface ISearchService {
	
	/* Cache缓存对象 start */
	
	// 获得类信息
	public Classes findClassesCache(String classesEn);
	// 获得dp
	DataProperty findDataPropertyCache(String classesEn, String dpEn);
	// 获得op
	ObjectProperty findObjectPropertyCache(String classesEn, String opEn);
	public List<CommonDataProperty> getCommonDataPropertyListByCache();
	// 查询公共关联属性字段
	public List<CommonObjectProperty> getCommonObjectPropertyListByCache();
	// 查询类列表
	public List<Classes> getClassesListByCache();
	// 查询类下数据属性
	public List<DataProperty> getDataPropertyListCache(String classesEn);
	// 查询类下关联属性
	public List<ObjectProperty> getObjectPropertyListCache(String classesEn);
	// 词表-自动补全
	public List<String> getWordListByAutoComple(String word);
	// 词表关系展示
	public List<HashMap<String, Object>> getThesauriWordReference(String word);
	// 查询字典类
	public List<Dict> getDictListByCache();
	// 查询字典项
	public List<DictItem> getDictItemListByCache(String dictNameEn);
	
	/* Cache缓存对象 end */
	 
	/* 搜索 start */
	
	/**
	 * 查询关键词核记录总数
	 * @param baseURL
	 * @param queryStr
	 * @param filterQueryStr
	 * @return
	 */
	public Long searchKwCount(String queryStr);
	
	/**
	 * 词表core总数查询
	 * @param queryStr
	 * @param filterQueryStr
	 * @return
	 */
	public Long searchWordCount(String queryStr);
	
	/**
	 * 百科core总数查询
	 * @param queryStr
	 * @param filterQueryStr
	 * @return
	 */
	public Long searchBaikeCount(String queryStr);

	/**
	 * 查询记录总数
	 * 
	 * @param queryStr
	 *            solr表达式
	 * @param parmArray
	 *            过滤查询 *:* （支持数组）
	 * @return 返回记录总数
	 */
	public Long searchCount(String queryStr, String[] filterQueryStr);

	/**
	 * 关键词core搜索
	 * @param queryStr
	 * @param showFields
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> searchKw(String queryStr,String[] showFields,int pageNum, int pageSize);
	
	/**
	 * 百科core搜索
	 * @param queryStr
	 * @param showFields
	 * @param highlightFields
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> searchBaike(String queryStr,String[] showFields,String[] highlightFields, int pageNum, int pageSize);
	
	/**
	 * 词表core搜索
	 * @param queryStr
	 * @param showFields
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> searchWord(String queryStr,String[] showFields,int pageNum, int pageSize);
	
	/**
	 * 搜索结果集
	 * 
	 * @param queryStr
	 *            solr查询条件
	 * @param filterQueryStr
	 *            过滤查询 *:* （支持数组）
	 * @param sortFields
	 *            排序字段 支持多个 map(key:desc/asc)
	 * @param highlightFields
	 *            标红 支持多值
	 * @param showFields
	 *            显示字段（必须填写id字段）
	 * @param pageNum
	 *            页码
	 * @param pageSize
	 *            每页记录数
	 */
	public HashMap<String, Object> search(String queryStr,
			String[] filterQueryStr, String[] highlightFields,
			String[] showFields, Object sortField,
			int pageNum, int pageSize);
	
	/**
	 * 支持权重查询
	 * @param queryStr
	 * @param filterQueryStr
	 * @param highlightFields
	 * @param showFields
	 * @param sortField
	 * @param isOpenWeight 是否开启权重
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> search(String queryStr,
			String[] filterQueryStr, String[] highlightFields,
			String[] showFields, Object sortField,boolean isOpenWeight,
			int pageNum, int pageSize);
	
	public HashMap<String, Object> search(String queryStr,
			String[] filterQueryStr, String[] highlightFields,
			String[] showFields, Object sortField,int sortRuleScope,boolean isOpenWeight,
			int pageNum, int pageSize);
	
	/**
	 * 支持自定义solrbq权重查询
	 * @param queryStr
	 * @param filterQueryStr
	 * @param highlightFields
	 * @param showFields
	 * @param sortField
	 * @param isOpenWeight 是否开启权重（后台配置的权重）
	 * @param solrBq 自定义值权重查询  key格式为  $title:词  value为权重值 如 {$title:九瑞,10}
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> search(String queryStr,
			String[] filterQueryStr, String[] highlightFields,
			String[] showFields, Object sortField,int sortRuleScope,boolean isOpenWeight,Map<String,String> solrBq,
			int pageNum, int pageSize);
	
	/**
	 * 分组查询
	 * @param queryStr 表达式
	 * @param filterQueryStr 筛选表达式
	 * @param groupFields 分组的域
	 * @param groupQueryStr 分组筛选条件
	 * @param groupLimit 每组显示的个数
	 * @return
	 */
	public HashMap<String, Object> searchGroup(String queryStr, String[] filterQueryStr, 
			String[] groupFields, String[] groupQueryStr,int groupLimit);
	
	/**
	 * 获得详细数据
	 * 
	 * @param id
	 * 
	 * @param showFields
	 *            前台显示的字段
	 * @return
	 */
	public HashMap<String, Object> getDetail(String id,
			String[] showFields);

	/**
	 * 分面
	 * 
	 * @param queryStr
	 *            solr查询条件
	 * @param filterQueryStr
	 *            过滤查询 *:* （支持数组）
	 * @param facetFields
	 *            分面字段
	 * @param limit
	 *            显示记录数
	 * @return
	 */
	public HashMap<String, Object> searchFacet(String queryStr,
			String[] filterQueryStr, String[] facetFields, int limit);

	/**
	 * 百科分面
	 * @param queryStr
	 * @param facetFields
	 * @param limit
	 * @return
	 */
	public HashMap<String, Object> searchBaikeFacet(String queryStr,
			 String[] facetFields, int limit);
	
	/**
	 * 标引api接口 总数
	 * @param queryStr
	 * @param filterQueryStr
	 * @return
	 */
	public Long searchIndexingCount(String queryStr, String[] filterQueryStr) throws Exception; 
	/**
	 * 标引api接口  查询
	 * @param queryStr
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public HashMap<String, Object> searchIndexing(String queryStr,int pageNum, int pageSize);
	/* 搜索 end */
	
	/* es查询 start*/
	/**
	 * es 统计查询
	 * @param index 核
	 * @param type 类型
	 * @param size 返回数量
	 * @param field 聚合字段
	 * @return
	 */
	public Map<Object, Object> esStatSearch(Map<String, Object> conditions,String index,String type,int size,String field);
	public Map<String, Object> esStatSearch(Map<String, Object> conditions,String index,String type,int size,String field,String condition);
	
	/**
	 * es 查询总数
	 * @param conditions 条件
	 * @param index 核
	 * @param type 类型
	 * @return
	 */
	public Long esSearchCount(Map<String, Object> conditions,String index,String type);
	/**
	 * es 查询
	 * @param conditions 条件
	 * @param index 核
	 * @param type 类型
	 * @return
	 */
	public List<Map<String, Object>> esSearch(Map<String, Object> conditions,String index,String type,List<String>field,int pageNumber,int pageSize);
	
	/* es查询 end*/
	public  List<String> sortValue(String index, String type, int size, String field,String describe);
	
	/**
	 *
	* method: getSumForColumnName
	* Description:根据create_date分组获取价格数据的和
	* @author 邢天龙
	* @date 2018年4月13日 上午9:22:35
	* @version 1.0
	 */
	public List<Map<String,Object>> getSumForColumnName(String index, String type,String groupByColumn,String sumColumn,Map<String,Object> map);
	
	/**
	 * 
	* method: getHotWordsPercentage
	* Description:获得热词的百分比
	* @author 邢天龙
	* @date 2018年4月16日 下午5:15:25
	* @version 1.0
	 */
	public Map<String,Object> getHotWordsPercentage(String index, String type,int size,Map<String,Object> map,String field);

	/**
	    * method: getVisitorsNumber
	    * Description:获得访客数量
	    * @author 邢天龙
	    * @date 2018年4月24日 上午10:12:26
	    * @version 1.0
	     */
	public Long  getVisitorsNumber(Map<String, Object> conditions,String index,String type);

}
